#coding=utf-8
#encoding: utf-8
import logging
'''
Created on 2015年4月16日

    接收模块，每5分钟执行一次。用于接收FTP日志文件
    并对文件进行校验
    如果数据校验正确，则下载数据到receive目录下
    如果一个系统下所有数据均校验正确后，生成就绪文件。
    
    目录结构如下所示：
        Data
          |--2015-04-16
                |---sys
                     |___logA.dat
                     |---logB.dat (注意下载完成后。生成dat文件。下载过程中改名

@author: leoZ
'''
from time import sleep
from datetime import date
from com.cyou.receive.FtpReceive import FtpReceive
from com.cyou.repository.EtlJob import EtlJobDao
logging.basicConfig()
log = logging.getLogger("HQLReceive")
log.setLevel(logging.DEBUG)

class HQLReceive(object):
    curTime = None
    ftpReceive = None #处理FTP接收任务
    #打印下载任务完成情况
    def printJobStatus(self):
        etlJobDao = EtlJobDao()
        jobs = etlJobDao.loadAll()
        log.debug("打印下载任务完成情况")
        for job in jobs:
            log.debug ("任务:%s-%s 执行状态%s" % (job.etlSystemName, job.etlJobName, job.lastJobStatus))
    #打印下载任务完成情况
    def checkJobStatus(self):
        etlJobDao = EtlJobDao()
        jobs = etlJobDao.loadAll()
        for job in jobs:
            if job.lastJobStatus != "Done":
                log.debug ("存在未完成的任务-任务:%s-%s 执行状态%s" % (job.etlSystemName, job.etlJobName, job.lastJobStatus))
                return False
        return True
    #打印下载任务完成情况
    def updateJobStatus(self):
        etlJobDao = EtlJobDao()
        jobs = etlJobDao.loadAll()
        for job in jobs:
            etlJobDao.updateJobJobStatus('Ready', job.etlSystemName, job.etlJobName)
        return True
    #查看日期是否反转
    def checkDateOver(self):
        log.debug("检验时间是否发生变化")
        #如果处理的日期与当前日期不一致，证明昨天的数据没有处理完。就已经到底新的一天了。
        if date.today() == self.curTime:
            log.debug("时间未发生变化")
            return True
        self.curTime = date.today()
        log.debug("时间发生变化")
        #打印下载任务完成情况
        self.printJobStatus()
        #如果存在没有下载完成的任务，退出任务。
        if self.checkJobStatus() is False:
            self.stop = True
            return False
        #如果任务全部执行完成。更新所有任务状态为Ready
        self.updateJobStatus()
        #重新创建一下ftpReceive对象
        self.ftpReceive = FtpReceive()
        self.ftpReceive.init(self)
        return True
    #处理数据收集任务
    def process(self):
        #检查日期轮转
        if self.checkDateOver() is True:
            self.ftpReceive.process()
            #oracle还没有完成
    #初始化配置信息
    def init(self):
        self.curTime = date.today()
        self.stop = False
        log.debug("初始化，当前执行日期为：" + str(self.curTime.isoformat()))
        self.ftpReceive = FtpReceive()
        self.ftpReceive.init(self)

    #主循环，检查是否需要接收日志.主循环处理FTP下载。和DB导出功能都在这里实现
    def start(self):
        while True:
            self.process()
            sleep(3)
            if (self.stop):
                log.debug("退出程序")
                return
if __name__ == '__main__':
    hqlReceive = HQLReceive()
    hqlReceive.init()
    hqlReceive.start()